package com.zmj.handler;/**
 * 用途：
 * 开发：zhangmj
 * 日期：2018/9/23 0023 0:02
 */

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.databind.util.JSONWrappedObject;
import com.zmj.common.response.ServerResponse;
import com.zmj.dubbo.bean.RpcRequest;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import jdk.nashorn.internal.parser.JSONParser;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 用途：
 * @author zhangmj
 * @date 2018/9/23 00:02
 */
@Slf4j
public class RPCServerHandler extends ChannelInboundHandlerAdapter {

    private Map<String,Object> handlerMap = new HashMap<>();

    public RPCServerHandler(Map<String, Object> handlerMap) {
        this.handlerMap = handlerMap;
    }

    private Object response;

    public Object getResponse(){
        return  response;
    }

    public void setResponse(Object response) {
        this.response = response;
    }


    /**
     * 处理,得到客户端的请求数据,根据请求数据进行操作：
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // msg ---得到客户端传来的数据
        // ctx ---向客户端写数据
        log.info("服务器，接收到客户端信息：{}", JSON.toJSONString(msg));
        RpcRequest request = (RpcRequest) msg;
        Object result = null;
        log.info("服务器，开始处理客户端请求...");
        long start = System.currentTimeMillis();
        // 下面根据这个request 进行调用server的对应类的方法
        if(handlerMap.containsKey(request.getClassName())){
            Object clazz = handlerMap.get(request.getClassName());
            Method method = clazz.getClass().getMethod(request.getMethodName(),request.getTypes());
            result = method.invoke(clazz, request.getParams());
        }
        if(result == null){
            ServerResponse resp = ServerResponse.createByErrorMessage("未找到相关信息");
            ctx.write(resp);
        }else {
            // 把运行完成的 result 写给客户端
            ctx.write(result);
        }

        ctx.flush();
        ctx.close();
        long end = System.currentTimeMillis();
        log.info("服务器，结束处理客户端请求,耗时:{} 毫秒 ...",(end -start));
    }


    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("服务器，处理客户端请求...");
        // msg ---得到客户端传来的数据
        // ctx ---向客户端写数据
        ctx.writeAndFlush("你是一只猪");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        super.exceptionCaught(ctx, cause);
    }
}
